import Cocoa

//var str = "Hello, playground"

//集合
//使用初始化器来创建一个空的集合
//var letter = Set<Character>()
////向空的集合插入一个字符
//letter.insert("c")
//print(letter)
//
////使用数组字面量来创建一个集合
//var course: Set<String> = ["Math", "English", "Chinses"]
//course.insert("History")  //他插入的位置是随机的
//print(course)

//set类型的哈希值:为了能让类型存储在set当中,他必须是可哈希的--就是说类型必须提供计算他自身的哈希值的方法,所有swift的基础类型(比如Int, Float, Double,String, Bool)默认都是可哈希的.并且可以用于set或者字典的键
//struct Person {
//    var name: String
//    var age: Int
//}
//extension Person: Hashable {
//    func hash(into hasher: inout Hasher) {
//        hasher.combine(name)
//        hasher.combine(age)
//    }
//}
//
//var personSet = Set<Person>()
//personSet.insert(Person(name: "zhangsan", age: 17))


//集合的访问和修改
//可以使用for in来遍历集合,但是由于set集合是无序的,所以需要使用sorted方法来遍历已经排序好的集合
//course = Set<String>()
//let course: Set<String> = ["Math", "English", "History"]
//for i in course {
//    print(i)
//}
//print("----------")
//for i in course.sorted() {
//    print(i)
//}


//获取set里面元素的个数
//var letter: Set<Character> = ["A", "B", "C"]
//print(letter.count)
//print(letter.isEmpty) //判断是否为空


//添加元素:
//letter.insert("D") //直接调用insert方法
//print(letter)

//update(with:),如果已经有相等的元素,替换成新的元素,如果set中没有,则直接插入
//struct Person {
//    var name: String
//    var age: Int
//}
//extension Person: Hashable {
//    func hash(into hasher: inout Hasher) {
//        hasher.combine(name)
//    }
//}
////等价运算符重载"==",必须要遵循Equatable协议
//extension Person: Equatable {
//    static func == (lhs: Person, rhs: Person) -> Bool {
//        return lhs.name == rhs.name
//    }
//}
//
//var personSet: Set<Person> = [Person(name: "zhangsan", age: 20), Person(name: "lisi", age: 29)]
//personSet.update(with: Person(name: "zhangsan", age: 38))
//personSet.update(with: Person(name: "wangwu", age: 19))
//personSet.update(with: Person(name: "zhaoliu", age: 45))
//print(personSet)
//
////移除元素:filter:返回的是符合条件的集合元素
//print(personSet.filter({$0.age > 20}))
//print("-------------")
//print(personSet.removeFirst()) //返回的是移除的元素
//print(personSet)

//移除元素remove:因为类扩展哈希值以及赋值运算符重载比较的都是name,所以这里只需要看那么的参数原集合中是否有就好了
//print(personSet.remove(Person(name: "zhangsan", age: 12)))
//print(personSet.removeAll())



/*集合的交集,并集,补集
 * intersection: 交集
 * unoin: 并集
 * symmetricDifference: 对称差集
 * subtracting: 相对补集
 */

//let set: Set<Character> = ["A", "B", "C"]
//let set2: Set<Character> = ["B", "E", "F", "G"]
//print(set.intersection(set2)) //交集
//print(set.union(set2)) //并集
//print(set.symmetricDifference(set2))  //对称差集
//print(set.subtracting(set2)) //相对补集
//print(set2.subtracting(set))

/* set的判断方法:
 * isSubset(of:)判断当前set是否是另一个set或者sequence的子集
 * isSuperset(of)判断当前set是否是另一个set或者sequence的超集
 * isStrictSubset和isStrictSuperset判断当前set是否是另一个set的自己或者超集,但是又不等于另一个set
 * isDisjoint(with)判断两个set是否有公共的元素,如果没有返回true,有则返回false
 */
//let smallSet: Set = [1, 2, 3]
//let bigSet: Set = [1, 2, 3, 4]
//print(smallSet.isSubset(of: bigSet))
//print(smallSet.isSuperset(of: bigSet))
//print(smallSet.isStrictSubset(of: bigSet)) //Strict: 严格的；绝对的；精确的；详细的
//print(smallSet.isDisjoint(with: bigSet))
